package datastructure;
/*
 *  @类名: SqList
 *  @作者:刘佳昱、罗正淇、黄术珉、陈鲁宁
 *  @班级：23级网安一班
 *  @时间:2024.10.29
 *  @描述:该类为线性表的顺序存储结构实现
 */

public class SqList<E> {
    // 成员变量
    private int initCapacity = 10; // 初始容量
    private E[] data; // 存放顺序表中的元素
    private int size; // 顺序表的长度
    private int capacity; // 当前顺序表的容量

    // 构造方法
    public SqList() {
        this.capacity = initCapacity;
        this.data = (E[]) new Object[capacity];
        this.size = 0;
    }

    // 私有方法：更新容量
    private void updateCapacity(int newCapacity) {
        E[] newData = (E[]) new Object[newCapacity];
        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        }
        data = newData;
        this.capacity = newCapacity;
    }
    //姓名：刘佳昱
    // 由含若干个元素的数组a的全部元素整体创建顺序表
    public void createList(E[] a) {
        if (a == null || a.length == 0) return;

        int newLength = a.length;
        if (newLength > capacity) {
            updateCapacity(newLength * 2);
        }

        for (int i = 0; i < newLength; i++) {
            data[i] = a[i];
        }
        size = newLength;
    }

    // 在线性表的末尾添加一个元素e
    public void add(E e) {
        if (size >= capacity) {
            updateCapacity(capacity * 2);
        }
        data[size++] = e;
    }

    // 求线性表长度
    public int getSize() {
        return size;
    }

//     设置线性表的长度（此方法一般不用，因为size是自动维护的）
     public void setSize(int size) {
         if (size > capacity || size < 0) throw new IllegalArgumentException("Invalid size");
         this.size = size;
     }
    //姓名：黄术珉
    // 返回线性表中序号为i的元素
    public E getElem(int i) {
        if (i < 0 || i >= size) throw new IndexOutOfBoundsException("Index out of bounds");
        return data[i];
    }

    // 设置序号i的元素为e
    public void setElem(int i, E e) {
        if (i < 0 || i >= size) throw new IndexOutOfBoundsException("Index out of bounds");
        data[i] = e;
    }

    // 查找第一个为e的元素的序号
    public int getNo(E e) {
        for (int i = 0; i < size; i++) {
            if (data[i].equals(e)) {
                return i;
            }
        }
        return -1; // 未找到
    }
    //姓名：罗正淇
    // 交换data[i]和data[j]
    public void swap(int i, int j) {
        if (i < 0 || i >= size || j < 0 || j >= size) throw new IndexOutOfBoundsException("Index out of bounds");
        E temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }

    // 在线性表中序号i位置插入元素e
    public void insert(int i, E e) {
        if (i < 0 || i > size) throw new IndexOutOfBoundsException("Index out of bounds");
        if (size >= capacity) {
            updateCapacity(capacity * 2);
        }
        for (int j = size; j > i; j--) {
            data[j] = data[j - 1];
        }
        data[i] = e;
        size++;
    }

    // 删除线性表中序号i的元素
    public void delete(int i) {
        if (i < 0 || i >= size) throw new IndexOutOfBoundsException("Index out of bounds");
        for (int j = i; j < size - 1; j++) {
            data[j] = data[j + 1];
        }
        data[--size] = null; // 清理引用
    }
}
    //姓名：陈鲁宁